# ============================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name: CMakeLists.txt
# * Author   : 苏木
# * Date     : 2025-05-22
# * Version  : 
# * Description: cmake version 3.16.3
# ============================================================
## https://cmake.com.cn/cmake/help/latest/guide/tutorial/index.html
## https://cmake.org/cmake/help/latest/

# 指定 CMake 的最低版本要求
# --------------------------------------------------
cmake_minimum_required(VERSION 3.10)


# 设置项目名称和使用的编程语言
# --------------------------------------------------
project(SPROJECT C)


# 指定可执行程序和源文件
# --------------------------------------------------
add_executable(app_demo.out main.c)


# 全局属性，set_property()和get_property()，可以在任何类型的实体上设置和获取任何属性。
# --------------------------------------------------
# get_cmake_property(resultVar property)
# 像get_property()一样，resultVar是一个变量的名称，当命令返回时，请求的属性的值将存储在该变量中。属性参数可以是任何全局属性的名称，也可以是以下伪属性之一:
#     VARIABLES       返回所有常规(即非缓存)变量的列表。
#     CACHE_VARIABLES 返回所有缓存变量的列表。
#     COMMANDS        返回所有已定义的命令、函数和宏的列表。命令由CMake预定义，而函数和宏可以由CMake(通常通过模块)或项目本身定义。一些返回的名称会对应于未归档的或不打算直接用于项目的内部实例。返回的名称可能与最初定义的名称的大小写不同。
#     MACROS          返回已定义宏的列表。这将是伪属性返回COMMANDS的子集，但请注意名称的大小写可能与伪属性报告的COMMANDS不同。
#     COMPONENTS      返回由install()命令定义的所有组件的列表
message(STATUS "[USER:TOP]==> ${CMAKE_VERSION} 自定义全局属性")

set_property(
	GLOBAL 
	PROPERTY PROJECT_VERSION "1.2.3"  # 自定义全局属性
)

# 获取全局属性
get_property(ver 
	GLOBAL 
	PROPERTY PROJECT_VERSION
)

get_cmake_property(resultVar1 PROJECT_VERSION)
# get_cmake_property(resultVar2 VARIABLES)
# get_cmake_property(resultVar3 CACHE_VARIABLES)
# get_cmake_property(resultVar4 COMMANDS)
# get_cmake_property(resultVar5 MACROS)
# get_cmake_property(resultVar6 COMPONENTS)

message(STATUS "[USER:TOP]Global Property: PROJECT_VERSION = ${ver}")  # 输出 1.2.3
message(STATUS "[USER:TOP]Global Property: ver = ${ver}")  # 输出 1.2.3
message(STATUS "[USER:TOP]Global Property: resultVar1 = ${resultVar1}")  # 输出 1.2.3
# message(STATUS "[USER:TOP]Global Property: resultVar2 = ${resultVar2}")
# message(STATUS "[USER:TOP]Global Property: resultVar3 = ${resultVar3}")
# message(STATUS "[USER:TOP]Global Property: resultVar4 = ${resultVar4}")
# message(STATUS "[USER:TOP]Global Property: resultVar5 = ${resultVar5}")
# message(STATUS "[USER:TOP]Global Property: resultVar6 = ${resultVar6}")
message("")
